1 About

1.1 Contributions

Please note that authorship is alphabetical. Contributions are listed below - see github for details and who to blame for what :-).

1.3 Citation

If you wish to refer to any of the material from this report please cite as:

  • Anderson, B., (2020) Air Quality in Southampton (UK): Exploring the data for 2020 , University of Southampton: Southampton, UK.

Report circulation:

  • Public

Report purpose:

This work is (c) 2020 the University of Southampton.

2 Introduction

Data downloaded from http://southampton.my-air.uk. See also https://www.southampton.gov.uk/environmental-issues/pollution/air-quality/.

Southampton City Council collects various forms of air quality data at the sites shown in 2.1. WHO publishes information on the health consequences and “acceptable” exposure levels for each of these.

lDT <- data.table::melt(origDataDT, id.vars = c("site", "dateTimeUTC"), measure.vars = c("co", "no2", "nox", 
    "oz", "pm10", "pm2_5", "so2"), value.name = "value"  # varies 
)

lDT[, `:=`(obsDate, lubridate::date(dateTimeUTC))]

# remove NA lDT <- lDT[!is.na(value)]
t <- lDT[!is.na(value), .(from = min(dateTimeUTC), to = max(dateTimeUTC), nObs = .N), keyby = .(site, variable)]

kableExtra::kable(t, caption = "Dates data != NA available by site and measure", digits = 2) %>% kable_styling()
Table 2.1: Dates data != NA available by site and measure
site variable from to nObs
Southampton - A33 Roadside (near docks, AURN site) no2 2020-01-01 01:00:00 2020-03-23 17:00:00 1924
Southampton - A33 Roadside (near docks, AURN site) pm10 2020-01-01 01:00:00 2020-03-23 16:00:00 1779
Southampton - Background (near city centre, AURN site) no2 2020-01-01 01:00:00 2020-03-23 17:00:00 1946
Southampton - Background (near city centre, AURN site) oz 2020-01-01 01:00:00 2020-03-23 17:00:00 1934
Southampton - Background (near city centre, AURN site) pm10 2020-01-01 01:00:00 2020-03-23 17:00:00 1959
Southampton - Background (near city centre, AURN site) pm2_5 2020-01-01 01:00:00 2020-03-23 17:00:00 1959
Southampton - Background (near city centre, AURN site) so2 2020-01-01 01:00:00 2020-03-23 17:00:00 1933
Southampton - Onslow Road (near RSH) no2 2020-01-01 01:00:00 2020-03-23 17:00:00 1880
Southampton - Onslow Road (near RSH) nox 2020-01-01 01:00:00 2020-03-23 17:00:00 1880
Southampton - Victoria Road (Woolston) no2 2020-01-01 01:00:00 2020-03-23 17:00:00 1859
Southampton - Victoria Road (Woolston) nox 2020-01-01 01:00:00 2020-03-23 17:00:00 1859

3 Summarise data

Summarise previously downloaded and processed data… Note that this may not be completely up to date.

t <- lDT[, .(mean = mean(value, na.rm = TRUE)), keyby = .(site, variable)]

kableExtra::kable(t, caption = "Mean values per site (NaN indicates not measured)") %>% kable_styling()
Table 3.1: Mean values per site (NaN indicates not measured)
site variable mean
Southampton - A33 Roadside (near docks, AURN site) co NaN
Southampton - A33 Roadside (near docks, AURN site) no2 30.587630
Southampton - A33 Roadside (near docks, AURN site) nox NaN
Southampton - A33 Roadside (near docks, AURN site) oz NaN
Southampton - A33 Roadside (near docks, AURN site) pm10 17.101686
Southampton - A33 Roadside (near docks, AURN site) pm2_5 NaN
Southampton - A33 Roadside (near docks, AURN site) so2 NaN
Southampton - Background (near city centre, AURN site) co NaN
Southampton - Background (near city centre, AURN site) no2 25.938027
Southampton - Background (near city centre, AURN site) nox NaN
Southampton - Background (near city centre, AURN site) oz 48.800672
Southampton - Background (near city centre, AURN site) pm10 14.892496
Southampton - Background (near city centre, AURN site) pm2_5 9.405207
Southampton - Background (near city centre, AURN site) so2 2.485101
Southampton - Bitterne co NaN
Southampton - Bitterne no2 NaN
Southampton - Bitterne nox NaN
Southampton - Bitterne oz NaN
Southampton - Bitterne pm10 NaN
Southampton - Bitterne pm2_5 NaN
Southampton - Bitterne so2 NaN
Southampton - Onslow Road (near RSH) co NaN
Southampton - Onslow Road (near RSH) no2 36.296968
Southampton - Onslow Road (near RSH) nox 72.896489
Southampton - Onslow Road (near RSH) oz NaN
Southampton - Onslow Road (near RSH) pm10 NaN
Southampton - Onslow Road (near RSH) pm2_5 NaN
Southampton - Onslow Road (near RSH) so2 NaN
Southampton - Redbridge co NaN
Southampton - Redbridge no2 NaN
Southampton - Redbridge nox NaN
Southampton - Redbridge oz NaN
Southampton - Redbridge pm10 NaN
Southampton - Redbridge pm2_5 NaN
Southampton - Redbridge so2 NaN
Southampton - Victoria Road (Woolston) co NaN
Southampton - Victoria Road (Woolston) no2 25.121248
Southampton - Victoria Road (Woolston) nox 54.818397
Southampton - Victoria Road (Woolston) oz NaN
Southampton - Victoria Road (Woolston) pm10 NaN
Southampton - Victoria Road (Woolston) pm2_5 NaN
Southampton - Victoria Road (Woolston) so2 NaN

Table 3.1 gives an indication of the availability of the different measures.

4 Analysis

In this section we present graphical analysis of the previoulsy downloaded data. Note this is just a snapshot of the data available.

4.1 Nitrogen Dioxide

yLab <- "Nitrogen Dioxide (ug/m3)"
dt <- lDT[variable == "no2"]
t <- dt[, .(mean = mean(value, na.rm = TRUE), sd = sd(value, na.rm = TRUE), min = min(value, na.rm = TRUE), 
    max = max(value, na.rm = TRUE)), keyby = .(site)]
kableExtra::kable(t, caption = "Summary of NO2 data") %>% kable_styling()
Table 4.1: Summary of NO2 data
site mean sd min max
Southampton - A33 Roadside (near docks, AURN site) 30.58763 20.59193 0.0 102.9
Southampton - Background (near city centre, AURN site) 25.93803 16.51945 2.3 130.6
Southampton - Bitterne NaN NA Inf -Inf
Southampton - Onslow Road (near RSH) 36.29697 19.74920 3.3 125.2
Southampton - Redbridge NaN NA Inf -Inf
Southampton - Victoria Road (Woolston) 25.12125 17.37546 0.0 106.7

Table 4.1 suggests that there may be a few (0) negative values. These are summarised in 4.2 while Figure 4.1 shows the availability and levels of the pollutant data over time.

t <- head(dt[value < 0], 10)
kableExtra::kable(t, caption = "Negative NO2 values (up to first 10)") %>% kable_styling()
Table 4.2: Negative NO2 values (up to first 10)
site dateTimeUTC variable value obsDate
t <- table(dt[value < 0]$site)
kableExtra::kable(t, caption = "Negative NO2 values (count by site)") %>% kable_styling()
Table 4.2: Negative NO2 values (count by site)
Freq
# dt,xvar, yvar,fillVar, yLab
p <- makeTilePlot(dt, xVar = "dateTimeUTC", yVar = "site", fillVar = "value", yLab = yLab)

p
Nitrogen Dioxide data availability and levels over time

Figure 4.1: Nitrogen Dioxide data availability and levels over time

Figure 4.2 shows daily mean values for all sites over time and includes smoother trend lines for each site.

plotDT <- dt[!is.na(value), .(mean = mean(value, na.rm = TRUE)),
             keyby = .(obsDate, site)]

p <- makeDotPlot(plotDT, 
                 xVar = "obsDate", 
                 yVar = "mean", 
                 byVar = "site", 
                 yLab = paste0("Mean daily ", yLab)
                 )

p <- p +
  geom_smooth() + # add smoothed line
  labs(caption = "Trend line = Generalized additive model (gam) with integrated smoothness estimation")

if(doPlotly){
  p
  plotly::ggplotly(p + xlim(xlimMinDate, xlimMaxDate)) # interactive, xlimited # interactive
} else {
  p
}
Nitrogen Dioxide levels, Southampton (daily mean

Figure 4.2: Nitrogen Dioxide levels, Southampton (daily mean

dt <- dt[dateTimeUTC > oneYearAgo]

t <- dt[value > hourlyNo2Threshold_WHO][order(-value)]

kableExtra::kable(caption = paste0("Values greater than WHO threshold (NO2 > ", hourlyNo2Threshold_WHO, 
    ", last 12 months)"), head(t, 10)) %>% kable_styling()
Table 4.3: Values greater than WHO threshold (NO2 > 200, last 12 months)
site dateTimeUTC variable value obsDate
p <- makeDotPlot(dt[!is.na(value)], xVar = "dateTimeUTC", yVar = "value", byVar = "site", yLab = yLab)

p <- p + geom_hline(yintercept = hourlyNo2Threshold_WHO) + labs(caption = "Reference line = WHO hourly threshold")


plotly::ggplotly(p)  # for interaction

Figure 4.3: Nitrogen Dioxide levels, Southampton (hourly, last 12 months)

Figure 4.3 shows hourly values for all sites for the last 12 months. In this period there were 0 hours when the hourly Nitrogen Dioxide level breached the relevant WHO hourly threshold (200). The worst 10 cases (if any) are shown in Table 4.3.

Clearly there are winter peaks, the mean daily values show less variance (and less extremes) than the hourly data and there has also been a decreasing trend over time.

4.2 PM 10

PM 10 data: has more sensors and wider coverage than PM2.5

yLab <- "PM 10 (ug/m3)"
dt <- lDT[variable == "pm10"]

t <- dt[, .(mean = mean(value, na.rm = TRUE), sd = sd(value, na.rm = TRUE), min = min(value, na.rm = TRUE), 
    max = max(value, na.rm = TRUE)), keyby = .(site)]
kableExtra::kable(t, caption = "Summary of pm10 data") %>% kable_styling()
Table 4.4: Summary of pm10 data
site mean sd min max
Southampton - A33 Roadside (near docks, AURN site) 17.10169 11.11763 0.0 99.0
Southampton - Background (near city centre, AURN site) 14.89250 8.81082 0.8 76.4
Southampton - Bitterne NaN NA Inf -Inf
Southampton - Onslow Road (near RSH) NaN NA Inf -Inf
Southampton - Redbridge NaN NA Inf -Inf
Southampton - Victoria Road (Woolston) NaN NA Inf -Inf

Table 4.4 suggests that there may be a few (0) negative values. These are shown in 4.5 while 4.4 shows data availability and PM 10 levels over time at each site.

t <- head(dt[value < 0], nrow(dt[value < 0]))
kableExtra::kable(head(t), caption = "Negative PM10 values - first 6") %>% kable_styling()
Table 4.5: Negative PM10 values - first 6
site dateTimeUTC variable value obsDate
p <- makeTilePlot(lDT[variable == "pm10"], xVar = "dateTimeUTC", yVar = "site", fillVar = "value", yLab = yLab)

p
Availability and level of PM 10 data over time

Figure 4.4: Availability and level of PM 10 data over time

plotDT <- dt[!is.na(value), .(mean = mean(value, na.rm = TRUE)),
             keyby = .(obsDate, site)]

extremePm10Daily <- plotDT[mean > dailyPm10Threshold_WHO][order(-mean)]

kableExtra::kable(caption = paste0("10 highest values greater than WHO threshold (PM 10 > ", 
                                   dailyPm10Threshold_WHO , ")"), 
                  digits = 2,
                  head(extremePm10Daily, 10)) %>%
  kable_styling()
Table 4.6: 10 highest values greater than WHO threshold (PM 10 > 50)
obsDate site mean
p <- makeDotPlot(plotDT, 
                 xVar = "obsDate", 
                 yVar = "mean", 
                 byVar = "site", 
                 yLab = paste0("Mean daily ", yLab)
                 )

p <- p + 
  geom_hline(yintercept = dailyPm10Threshold_WHO) +
  geom_smooth() + # add smoothed line
  labs(caption = "Trend line = Generalized additive model (gam) with integrated smoothness estimation\nReference line = WHO PM10 mean daily threshold")


plotly::ggplotly(p) # interactive

Figure 4.5: PM10 levels, Southampton (daily mean)

nDaysOverThreshold <- uniqueN(extremePm10Daily$obsDate)
nDays <- uniqueN(plotDT$obsDate) # need to count days not site-days

Figure 4.5 shows daily values for all sites across the entire dataset and indicates the 0 days (0%) that breached the WHO PM10 daily mean exposure threshold (50) - see Table 4.6.

dt <- dt[dateTimeUTC > oneYearAgo]
t <- dt[value > 100][order(-value)]

kableExtra::kable(caption = "10 highest hourly values (PM 10 > 100)", head(t)) %>% kable_styling()
Table 4.7: 10 highest hourly values (PM 10 > 100)
site dateTimeUTC variable value obsDate
p <- makeDotPlot(dt[!is.na(value)], xVar = "dateTimeUTC", yVar = "value", byVar = "site", yLab = yLab)

p <- p + labs(caption = "NB: There is no WHO PM10 hourly threshold")

if (doPlotly) {
    p
    plotly::ggplotly(p + xlim(xlimMinDateTime, xlimMaxDateTime))  # interactive, xlimited # interactive
} else {
    p
}
PM10 levels, Southampton (hourly, last 12 months)

Figure 4.6: PM10 levels, Southampton (hourly, last 12 months)

Figure 4.6 shows hourly PM 10 values for all sites over the last 12 months and suggests there may be outliers (see Table 4.7).

4.3 PM 2.5

yLab <- "PM 2.5 (ug/m3)"
dt <- lDT[variable == "pm2_5"]
t <- dt[!is.na(value), .(mean = mean(value, na.rm = TRUE), sd = sd(value, na.rm = TRUE), min = min(value, 
    na.rm = TRUE), max = max(value, na.rm = TRUE)), keyby = .(site)]
kableExtra::kable(t, caption = "Summary of pm2_5 data") %>% kable_styling()
Table 4.8: Summary of pm2_5 data
site mean sd min max
Southampton - Background (near city centre, AURN site) 9.405207 6.784957 0.4 48.5

Table 4.8 suggests that there may be a few (0) negative values. These are shown in Table 4.9 while Figure 4.7 shows data availability and PM 2.5 levels over time at each site.

t <- head(dt[value < 0], nrow(dt[value < 0]))
kableExtra::kable(head(t), caption = "Negative pm2_5 values - first 6") %>% kable_styling()
Table 4.9: Negative pm2_5 values - first 6
site dateTimeUTC variable value obsDate
p <- makeTilePlot(dt, xVar = "dateTimeUTC", yVar = "site", fillVar = "value", yLab = yLab)

p
Availability and level of PM 10 data over time

Figure 4.7: Availability and level of PM 10 data over time

plotDT <- dt[!is.na(value), .(mean = mean(value, na.rm = TRUE)),
             keyby = .(obsDate, site)]

extremePm25Daily <- plotDT[mean > dailyPm2.5Threshold_WHO][order(-mean)]

kableExtra::kable(caption = paste0("6 highest values greater than WHO threshold (PM 2.5 > ", 
                                   dailyPm2.5Threshold_WHO , ")"), 
                  digits = 2,
                  head(extremePm25Daily)) %>%
  kable_styling()
Table 4.10: 6 highest values greater than WHO threshold (PM 2.5 > 25)
obsDate site mean
2020-01-21 Southampton - Background (near city centre, AURN site) 32.60
2020-01-20 Southampton - Background (near city centre, AURN site) 26.30
2020-01-22 Southampton - Background (near city centre, AURN site) 26.27
p <- makeDotPlot(plotDT, 
                 xVar = "obsDate", 
                 yVar = "mean", 
                 byVar = "site", 
                 yLab = paste0("Mean daily ", yLab)
                 )

p <- p + 
  geom_hline(yintercept = dailyPm2.5Threshold_WHO) +
  geom_smooth() + #add smoothed line
  labs(caption = "Trend line = Generalized additive model (gam) with integrated smoothness estimation\nReference line = WHO daily PM2.5 threshold")


if(doPlotly){
  p
  plotly::ggplotly(p + xlim(xlimMinDate, xlimMaxDate)) # interactive, xlimited # interactive
} else {
  p
}
PM2_5 levels, Southampton (daily mean)

Figure 4.8: PM2_5 levels, Southampton (daily mean)

nDaysOverThreshold <- uniqueN(extremePm25Daily$obsDate)
nDays <- uniqueN(plotDT$obsDate) # need to count days not site-days

Figure 4.8 shows daily values for all sites across the dataset and indicates that the WHO PM2_5 daily mean exposure threshold (25) was breached on 3 days (3.6 %). The 6 worst cases are shown in Table 4.10.

dt <- dt[dateTimeUTC > oneYearAgo]
t <- dt[value > 50][order(-value)]

kableExtra::kable(caption = "Extreme hourly values (PM 2.5 > 50, last 12 months, worst 6)", head(t)) %>% 
    kable_styling()
Table 4.11: Extreme hourly values (PM 2.5 > 50, last 12 months, worst 6)
site dateTimeUTC variable value obsDate
p <- makeDotPlot(dt[!is.na(value)], xVar = "dateTimeUTC", yVar = "value", byVar = "site", yLab = yLab)

p <- p + labs(caption = "NB: There is no WHO PM2.5 hourly threshold")

plotly::ggplotly(p)  # for interaction

Figure 4.9: PM2_5 levels, Southampton (hourly, last 12 months)

Figure 4.9 shows hourly values for all sites for the last 12 months while Table 4.11 reports the 6 worst hours.

5 Observations

  • Why are there large data holes? (see tile plots)
  • Nitorgen Dioxide levels appear to be trending downwards
  • For particulates the trend is more complex and the trends for PM10 and PM2.5 differ.
    • Something happened on the 27th October 2019 at 20:00. There are spikes on all hourly PM plots (although this is masked in the daily plots). Could it have been a cruise ship leaving?
    • Something else happened on the 2nd December 2019 at 21:00. Was this another ship?

6 Annex

6.1 Original data

skimr::skim(origDataDT)
Table 6.1: Data summary
Name origDataDT
Number of rows 52560
Number of columns 10
_______________________
Column type frequency:
character 1
logical 1
numeric 7
POSIXct 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
site 0 1 22 54 0 6 0

Variable type: logical

skim_variable n_missing complete_rate mean count
co 52560 0 NaN :

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
no 44951 0.14 21.11 35.21 -0.2 3.20 9.3 24.60 486.4 ▇▁▁▁▁
no2 44951 0.14 29.47 19.15 0.0 14.20 26.0 41.10 130.6 ▇▆▂▁▁
nox 48821 0.07 63.91 71.65 1.1 22.05 45.7 79.55 848.1 ▇▁▁▁▁
pm10 48822 0.07 15.94 10.03 0.0 9.00 14.0 20.30 99.0 ▇▂▁▁▁
oz 50626 0.04 48.80 21.98 0.0 33.95 53.9 65.70 89.4 ▂▃▅▇▃
pm2_5 50601 0.04 9.41 6.78 0.4 5.10 7.7 11.30 48.5 ▇▃▁▁▁
so2 50627 0.04 2.49 1.42 0.1 1.50 2.1 3.10 10.4 ▇▆▂▁▁

Variable type: POSIXct

skim_variable n_missing complete_rate min max median n_unique
dateTimeUTC 0 1 2020-01-01 01:00:00 2020-12-31 2020-07-01 12:30:00 8760

6.2 Long form of original data

skimr::skim(lDT)
Table 6.2: Data summary
Name lDT
Number of rows 367920
Number of columns 5
_______________________
Column type frequency:
character 1
Date 1
factor 1
numeric 1
POSIXct 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
site 0 1 22 54 0 6 0

Variable type: Date

skim_variable n_missing complete_rate min max median n_unique
obsDate 0 1 2020-01-01 2020-12-31 2020-07-01 366

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
variable 0 1 FALSE 7 co: 52560, no2: 52560, nox: 52560, oz: 52560

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
value 347008 0.06 30.62 38.75 0 8.7 20 42.1 848.1 ▇▁▁▁▁

Variable type: POSIXct

skim_variable n_missing complete_rate min max median n_unique
dateTimeUTC 0 1 2020-01-01 01:00:00 2020-12-31 2020-07-01 12:30:00 8760

6.3 Nitrogen Dioxide

t <- lDT[variable == "no2"]

skimr::skim(t)
Table 6.3: Data summary
Name t
Number of rows 52560
Number of columns 5
_______________________
Column type frequency:
character 1
Date 1
factor 1
numeric 1
POSIXct 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
site 0 1 22 54 0 6 0

Variable type: Date

skim_variable n_missing complete_rate min max median n_unique
obsDate 0 1 2020-01-01 2020-12-31 2020-07-01 366

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
variable 0 1 FALSE 1 no2: 52560, co: 0, nox: 0, oz: 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
value 44951 0.14 29.47 19.15 0 14.2 26 41.1 130.6 ▇▆▂▁▁

Variable type: POSIXct

skim_variable n_missing complete_rate min max median n_unique
dateTimeUTC 0 1 2020-01-01 01:00:00 2020-12-31 2020-07-01 12:30:00 8760
t <- lDT[variable == "no2" & value > hourlyNo2Threshold_WHO][order(-value)]

kableExtra::kable(caption = paste0("Values greater than WHO threshold (NO2 > ", hourlyNo2Threshold_WHO, 
    ")"), t) %>% kable_styling()
Table 6.4: Values greater than WHO threshold (NO2 > 200)
site dateTimeUTC variable value obsDate

6.4 PM 10

t <- lDT[variable == "pm10"]

skimr::skim(t)
Table 6.5: Data summary
Name t
Number of rows 52560
Number of columns 5
_______________________
Column type frequency:
character 1
Date 1
factor 1
numeric 1
POSIXct 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
site 0 1 22 54 0 6 0

Variable type: Date

skim_variable n_missing complete_rate min max median n_unique
obsDate 0 1 2020-01-01 2020-12-31 2020-07-01 366

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
variable 0 1 FALSE 1 pm1: 52560, co: 0, no2: 0, nox: 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
value 48822 0.07 15.94 10.03 0 9 14 20.3 99 ▇▂▁▁▁

Variable type: POSIXct

skim_variable n_missing complete_rate min max median n_unique
dateTimeUTC 0 1 2020-01-01 01:00:00 2020-12-31 2020-07-01 12:30:00 8760
kableExtra::kable(caption = paste0("PM 10 values greater than WHO threshold (NO2 > ", hourlyNo2Threshold_WHO, 
    ")"), extremePm10Daily) %>% kable_styling()
Table 6.6: PM 10 values greater than WHO threshold (NO2 > 200)
obsDate site mean

6.5 PM 2.5

t <- lDT[variable == "pm2_5"]

skimr::skim(t)
Table 6.7: Data summary
Name t
Number of rows 52560
Number of columns 5
_______________________
Column type frequency:
character 1
Date 1
factor 1
numeric 1
POSIXct 1
________________________
Group variables None

Variable type: character

skim_variable n_missing complete_rate min max empty n_unique whitespace
site 0 1 22 54 0 6 0

Variable type: Date

skim_variable n_missing complete_rate min max median n_unique
obsDate 0 1 2020-01-01 2020-12-31 2020-07-01 366

Variable type: factor

skim_variable n_missing complete_rate ordered n_unique top_counts
variable 0 1 FALSE 1 pm2: 52560, co: 0, no2: 0, nox: 0

Variable type: numeric

skim_variable n_missing complete_rate mean sd p0 p25 p50 p75 p100 hist
value 50601 0.04 9.41 6.78 0.4 5.1 7.7 11.3 48.5 ▇▃▁▁▁

Variable type: POSIXct

skim_variable n_missing complete_rate min max median n_unique
dateTimeUTC 0 1 2020-01-01 01:00:00 2020-12-31 2020-07-01 12:30:00 8760
kableExtra::kable(caption = paste0("PM 2.5 values greater than WHO threshold (NO2 > ", hourlyNo2Threshold_WHO, 
    ")"), extremePm25Daily) %>% kable_styling()
Table 6.8: PM 2.5 values greater than WHO threshold (NO2 > 200)
obsDate site mean
2020-01-21 Southampton - Background (near city centre, AURN site) 32.60417
2020-01-20 Southampton - Background (near city centre, AURN site) 26.30417
2020-01-22 Southampton - Background (near city centre, AURN site) 26.27083

7 Runtime

Report generated using knitr in RStudio with R version 3.6.3 (2020-02-29) running on x86_64-apple-darwin15.6.0 (Darwin Kernel Version 19.3.0: Thu Jan 9 20:58:23 PST 2020; root:xnu-6153.81.5~1/RELEASE_X86_64).

t <- proc.time() - startTime

elapsed <- t[[3]]

Analysis completed in 19.449 seconds ( 0.32 minutes).

R packages used:

  • data.table - (Dowle et al. 2015)
  • ggplot2 - (Wickham 2009)
  • here - (Müller 2017)
  • kableExtra - (Zhu 2018)
  • lubridate - (Grolemund and Wickham 2011)
  • plotly - (Sievert et al. 2016)
  • skimr - (Arino de la Rubia et al. 2017)

References

Arino de la Rubia, Eduardo, Hao Zhu, Shannon Ellis, Elin Waring, and Michael Quinn. 2017. Skimr: Skimr. https://github.com/ropenscilabs/skimr.

Dowle, M, A Srinivasan, T Short, S Lianoglou with contributions from R Saporta, and E Antonyan. 2015. Data.table: Extension of Data.frame. https://CRAN.R-project.org/package=data.table.

Grolemund, Garrett, and Hadley Wickham. 2011. “Dates and Times Made Easy with lubridate.” Journal of Statistical Software 40 (3): 1–25. http://www.jstatsoft.org/v40/i03/.

Müller, Kirill. 2017. Here: A Simpler Way to Find Your Files. https://CRAN.R-project.org/package=here.

Sievert, Carson, Chris Parmer, Toby Hocking, Scott Chamberlain, Karthik Ram, Marianne Corvellec, and Pedro Despouy. 2016. Plotly: Create Interactive Web Graphics via ’Plotly.js’. https://CRAN.R-project.org/package=plotly.

Wickham, Hadley. 2009. Ggplot2: Elegant Graphics for Data Analysis. Springer-Verlag New York. http://ggplot2.org.

Zhu, Hao. 2018. KableExtra: Construct Complex Table with ’Kable’ and Pipe Syntax. https://CRAN.R-project.org/package=kableExtra.